package com.java.base.exercise.annonation;

import java.lang.reflect.Field;
import java.util.Objects;

/**
 * @Author RenPu
 * @Date 2023/10/3 17:10
 * @Version 1.0
 * @Description:
 *
 *      将实体类的类注解解析出作为表名，
 *      实体类的属性如有注解标注则作为查询字段(如果注解没有设置值内容，则实体属性命名和和表字段保持一致)
 *      属性有注解标注，同时属性又被赋值则为查询条件
 *
 *
 **/
public class GenerntUtil {

    //Select 字段名 from 表名 where 字段名=属性赋值的值

    public String queryData(Object tab) throws IllegalAccessException {

        StringBuffer sb = new StringBuffer();

        StringBuffer sb2 = new StringBuffer();

        sb.append(" select ");
        //解析实体类的类注解，获取表名

        Class<?> aClass = tab.getClass();

        TableName tabAnnation = aClass.getAnnotation(TableName.class);

        if(Objects.isNull(tabAnnation)){
            throw new RuntimeException("table name is not exist !!!!!");
        }
        String tableName = tabAnnation.name();


        //解析实体类的属性，是否被注解标注，
        // 实体类的属性如有注解标注则作为查询字段(如果注解没有设置值内容，
        // 则实体属性命名和和表字段保持一致)
        Field[] fields = aClass.getDeclaredFields();
        for (Field field : fields) {
            Clounm clounm = field.getAnnotation(Clounm.class);
            if(Objects.isNull(clounm)) continue;
            if(clounm.value().equals("")){   //表名字段和实体类字段一致
                String name = field.getName();
                field.setAccessible(true);
                Object o = field.get(tab);
                if(o!=null&&Integer.parseInt(o.toString())!=0){  //实体字段被赋值，需要作为查询条件
                    sb2.append(" where "+name+"="+o);
                    sb.append(" "+name+" , ");
                }
            }else {     //作为条件查询的字段，解析注解的内容
                String clname=clounm.value();
                sb.append(" "+clname+" , ");
                field.setAccessible(true);
                Object o = field.get(tab);
                if(o!=null&&Integer.parseInt(o.toString())!=0){  //实体字段被赋值，需要作为查询条件
                    sb2.append(" where "+clname+"="+o);
                }
            }

        }
        sb.append("from"+"  "+tableName);
        sb.append(sb2.toString());


        return sb.toString();
    }


    public static void main(String[] args) throws IllegalAccessException {
//        GenerntUtil generntUtil = new GenerntUtil();
//
//        Order order = new Order();
//        order.setUserNo("146987008");
//        String result = generntUtil.queryData(order);
//
//        System.out.println(result);

    }
}
